上一篇有提到兩個問題,這一篇來講解我針對這兩個問題的解法,也歡迎大家有什麼好作法可以留言給我一起討論.
主要的問題是下面兩點:
在 Docker 建置好的 Image 會遇到太大的問題,當然希望 Image 越小越好.
每一次建置 Image 都要重新安裝一次插件,會讓建置的時間多很久.
面對 Image 太大問題,我後來使用 python:3.5-alpine 的 image 當基底,減少了至少200M的image容量.
這邊我使用一個樣板 Base Image,裡面都安裝專安需要的環境插件,只要準備好這個專案 Base Image ,就可以每次在建置新的 Image 的時候不用再重新安裝插件,可以加快很多的速度,至少減少了一半以上建置 Image 的時間.
Base Image Dockerfile
FROM python:3.5-alpine
MAINTAINER Pellok "pellok@gmail.com"
RUN apk update && \
apk add --no-cache --virtual deps build-base postgresql-dev libffi-dev openssh libpq gcc python-dev linux-headers musl-dev git autoconf automake libressl-dev jpeg-dev zlib-dev libmagic
ENV LIBRARY_PATH=/lib:/usr/lib
COPY requirements.txt /usr/src/app/
RUN pip install --upgrade pip setuptools && \
pip install --no-cache-dir -r /usr/src/app/requirements.txt
WORKDIR /usr/src/app
ONBUILD COPY . /usr/src/app
專案需要用到的插件放到 requirements.txt 檔案
pip freeze |grep -v oklib |grep -v git > deploy/docker/alpine/requirements.txt
建置 Base Image
docker build --rm -t ithome_pellok_2018:base deploy/docker/alpine
專案 Dockerfile
FROM ithome_pellok_2018:base
RUN python setup.py develop && \
find /usr/local \( -type d -a -name test -o -name tests \) -o \( -type f -a -name '*.pyc' -o -name '*.pyo' \) -exec rm -rf '{}' + && \
rm -f /usr/src/app/requirements.txt && rm -rf /var/cache/apk/*
EXPOSE 7788
CMD pserve production.ini
建置專案 docker
docker build .
上面兩個問題是實際應用的時候碰到的痛點,主要是要讓建置 Image 更快速,但是後來發現有更好用的工具可以使用,也可以整合到 Jenkins 來使用.